// 穷举检查
// never 类型可分配给每个类型；但是，没有类型可分配给 never（never 本身除外）。这意味着你可以使用缩小范围并依靠出现的 never
// 在 switch 语句中进行详尽检查。
//
// 例如，将 default 添加到我们的 getArea 函数中，尝试将形状分配给 never，当处理完所有可能的情况时，不会引发错误。
interface Circle {
    kind: "circle";
    radius: number;
}

interface Square {
    kind: "square";
    sideLength: number
}

interface zks {
    kind: "zks";
}


// type Shape = Circle | Square | zks;
type Shape = Circle | Square;


function getArea(shape: Shape) {
    switch (shape.kind) {
        case "circle":
            return Math.PI * shape.radius ** 2;
        case "square":
            return shape.sideLength ** 2;

        // 当我们处理完所有可能情况时，不会引发错误。但当我们添加一个新情况时，就会引发错误。
        // case"zks":
        //     return 555
        default:
            const _exhaustiveCheck: never = shape;
            return _exhaustiveCheck;
    }
}